package gnu.testlet.runner.compare;
//// Copyright (c) 2008 Fabien DUMINY (fduminy@jnode.org)
//
//// This file is part of Mauve.
//
//// Mauve is free software; you can redistribute it and/or modify
//// it under the terms of the GNU General Public License as published by
//// the Free Software Foundation; either version 2, or (at your option)
//// any later version.
//
//// Mauve is distributed in the hope that it will be useful,
//// but WITHOUT ANY WARRANTY; without even the implied warranty of
//// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//// GNU General Public License for more details.
//
//// You should have received a copy of the GNU General Public License
//// along with Mauve; see the file COPYING.  If not, write to
//// the Free Software Foundation, 59 Temple Place - Suite 330,
//// Boston, Mgnu.testlet//
//package org.sgx.gwtmauvegnu.testlet
//
//import org.sgx.gwtmauve.gnu.testletlt;
//import org.sgx.gwtmauve.gnu.testletlt;
//import org.sgx.gwtmauve.clgnu.testletlt;
//import org.sgx.gwtmgnu.testletlt;
//import org.sgx.gwtmauvgnu.testletlt;
//import org.sgx.gwtmauvegnu.testletlt;
//import gnu.testlet.runner.XMLReportParser;
//
//import java.io.File;
//import java.io.IOException;
//import java.util.ArrayList;
//import java.util.Arrays;
//import java.util.Iterator;
//import java.util.List;
//
//import net.sourceforge.nanoxml.XMLParseException;
//
///**
// * Comparator of 2 {@link RunResult}s
// * 
// * @author fabien
// *
// */
//public class ReportComparator {
//
//    private final RunResult result1;
//    private final RunResult result2;
//    
//    public static void main(String[] args) throws XMLParseException, IOException {
//        if (args.length < 3) {
//            System.out.println("usage : java " + ReportComparator.class.getName() + 
//                    " <report1.xml> <report2.xml> [html|text]");
//        } else {
//            File report1 = new File(args[0]);
//            File report2 = new File(args[1]);
//            String format = args[2];
//            compare(report1, report2, format);
//        }
//    }
//    
//    public static File compare(File report1, File report2, String format) throws XMLParseException, IOException {
//        XMLReportParser parser = new XMLReportParser();
//        RunResult result1 = parser.parse(report1);
//        RunResult result2 = parser.parse(report2);
//        
//        ReportComparator comparator = new ReportComparator(result1, result2);
//        RunComparison comparison = comparator.compare();
//        
//        final ComparisonWriter writer;
//        final String extension;
//        if ("text".equals(format)) {
//            writer = new TextComparisonWriter();
//            extension = "txt";
//        } else if ("html".equals(format)) {
//            writer = new HTMLComparisonWriter();
//            extension = "html";
//        } else {
//            extension = "txt";
//            writer = new TextComparisonWriter();
//        }
//        
//        int i = 0;
//        File output = new File(report2.getParent(), "comp_" + i + "." + extension);
//        while (output.exists()) {
//            i++;
//            output = new File(report2.getParent(), "comp_" + i + "." + extension);
//        }
//        writer.write(comparison, output);
//        System.out.println("Comparison wrote to " + output.getAbsolutePath());
//        
//        return output;
//    }
//    
//    public ReportComparator(RunResult result1, RunResult result2) {
//        this.result1 = result1;
//        this.result2 = result2;
//    }
//
//    /**
//     * TODO handle case of added/removed package/class/test/check results ?
//     * 
//     * @return
//     */
//    public RunComparison compare() {
//        RunComparison cr = new RunComparison(result1, result2);
//        
//        addSystemProperties(cr);
//        
//        for (Iterator itPackage1 = result1.getPackageIterator(); itPackage1.hasNext(); ) {
//            PackageResult pkg1 = (PackageResult) itPackage1.next();
//            PackageResult pkg2 = (PackageResult) getResult(pkg1, result2.getPackageIterator()); 
//
//            if (pkg2 == null) {
//                continue;
//            }
//
//            for (Iterator itClass1 = pkg1.getClassIterator(); itClass1.hasNext(); ) {
//                ClassResult cls1 = (ClassResult) itClass1.next();
//                ClassResult cls2 = (ClassResult) getResult(cls1, pkg2.getClassIterator()); 
//
//                if (cls2 == null) {
//                    continue;
//                }
//                
//                for (Iterator itTest1 = cls1.getTestIterator(); itTest1.hasNext(); ) {
//                    TestSubResult test1 = (TestSubResult) itTest1.next();
//                    TestSubResult test2 = (TestSubResult) getResult(test1, cls2.getTestIterator()); 
//
//                    compare(test1, pkg2, cls2, test2, cr);
//                }
//            }
//        }
//        
//        return cr;
//    }
//    
//    private void addSystemProperties(RunComparison runComparison) {
//        List names1 = Arrays.asList(result1.getSystemPropertyNames());
//        for (int i = 0; i < names1.size(); i++) {
//            String name = (String) names1.get(i);
//            runComparison.addSystemProperty(name, result1.getSystemProperty(name),
//                    result2.getSystemProperty(name));
//        }
//        
//        String[] names2 = result2.getSystemPropertyNames();
//        for (int i = 0; i < names2.length; i++) {
//            String name = names2[i];
//            if (!names1.contains(name)) {
//                runComparison.addSystemProperty(name, result1.getSystemProperty(name),
//                        result2.getSystemProperty(name));
//            }
//        }
//    }
//    
//    private void compare(TestSubResult test1, PackageResult pkg2, ClassResult cls2, TestSubResult test2,
//            RunComparison cr) {
//        if ((test2 == null) || (test1.getCheckCount() != test2.getCheckCount())) {
//            return;
//        }
//
//        List reachedCheckResults1 = getReachedCheckResults(test1);
//        List reachedCheckResults2 = getReachedCheckResults(test2);
//
//        final int size1 = reachedCheckResults1.size();
//        final int size2 = reachedCheckResults2.size();
//        
//        CheckResult check2 = null;
//        if (!reachedCheckResults2.isEmpty()) {
//            check2 = (CheckResult) reachedCheckResults2.get(reachedCheckResults2.size() - 1);
//        }
//        
//        cr.setProgression(pkg2, cls2, test2, check2, size2 - size1);
//    }
//    
//    private List getReachedCheckResults(TestSubResult test) {
//        List checkResults = new ArrayList();
//        
//        for (Iterator itCheck = test.getCheckIterator(); itCheck.hasNext(); ) {
//            CheckResult check = (CheckResult) itCheck.next();
//            if (!check.getPassed()) {
//                break;
//            }
//                
//            checkResults.add(check);
//        }
//        
//        return checkResults;
//    }
//    
//    private Result getResult(Result result1, Iterator results2) {
//        final String name1 = result1.getName();
//        Result result2 = null;
//        
//        while (results2.hasNext()) {
//            Result res2 = (Result) results2.next();
//            if (name1.equals(res2.getName())) {
//                result2 = res2;
//                break;
//            }
//        }
//        
//        return result2;
//    }
//}
